﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Denting
{
    public class DentingNode
    {
        private int beginNodeID = 99900001;//设置新增节点起始ID号
        private int beginElementID = 99900001;//设置新增单元起始ID号
        private Element _currentElement = new Element();
        private Element _nextElement = new Element();
        private Elements _elementsToSplit;   //设置要劈开的单元集合
        private Elements _elementsToPatch;   //设置要缝补的单元集合
        private Elements _elementsToRemain;  //设置保留的单元集合
        private Elements _elementsAll;      //所有的单元
        public Nodes _nodesAll;            //所有的节点
        private int _dentingNodeID;        //设置抗凹的压点
        public Nodes nsImpactor = new Nodes();


        public string inputFileFullName { get; set; }   //输入文件名
        public int ComponentID { get; set; }            //表面的COMPID
        public double ImpactorRadio { get; set; }       //设置半径
        public int SplitCounts { get; set; }            //设置的劈开次数
        

        

        private double DistanceToCenter(Node n)
        {
            Node cn=GetDentingNode();
            double d = 0.0;
            d = Math.Sqrt((n.X_position - cn.X_position) * (n.X_position - cn.X_position) + (n.Y_position - cn.Y_position) * (n.Y_position - cn.Y_position) + (n.Z_position - cn.Z_position) * (n.Z_position - cn.Z_position));
            return d;
        }

        private double DistanceToCenter(int nodeID)
        {
            Node cn = GetDentingNode();
            Node n = _nodesAll.GetNodeFromNodeID(nodeID);
            double d = 0.0;
            d = Math.Sqrt((n.X_position - cn.X_position) * (n.X_position - cn.X_position) + (n.Y_position - cn.Y_position) * (n.Y_position - cn.Y_position) + (n.Z_position - cn.Z_position) * (n.Z_position - cn.Z_position));
            return d;
        }

        private double MinDistanceInElements(Elements es)
        {
            if (es.Count==0)
            {
                //Console.WriteLine("最小距离为{0}", 0);
                return 0;
            }
            else
            {
                double dt = 1e20;
                Nodes NS = _nodesAll.FindNodesAttatchToElements(es);
                foreach (Node n in NS)
                {
                    if (DistanceToCenter(n) < dt)
                    {
                        dt = DistanceToCenter(n);
                    }
                }
                //Console.WriteLine("最小距离为{0}", dt);
                return dt;
                
            }
            
        }

        private Node GetDentingNode()
        {
            Node tempNode = new Node();
            foreach (Node d in _nodesAll)
            {
                if (_dentingNodeID==d.NodeID)
                {
                    tempNode=d;
                }
            }
            return tempNode;
        }

        public bool GroupElements()
        {
            if (GetDentingNode().NodeID != 0)
            {
                while (MinDistanceInElements(_elementsToPatch) < this.ImpactorRadio)
                {
                    if (_elementsToPatch.Count == 0)
                    {
                        _elementsToPatch = _elementsAll.FindElementsOnOneNode(_dentingNodeID);
                    }
                    else
                    {
                        _elementsToSplit.CombinElements(_elementsToPatch);
                        _elementsToPatch = _elementsAll.FindElementsAttatchToNodes(_nodesAll.FindNodesAttatchToElements(_elementsToSplit));
                        _elementsToPatch.ExceptElements(_elementsToSplit);
                    }
                    //新增格式化三角形代码，优化三角形的分割
                    //Console.WriteLine("XXXXXXXXXXXX:{0}", ElementsToSplit.Count);
                    //Console.WriteLine("pppppppppppp:{0}", ElementsToPatch.Count);
                    foreach (Element e in _elementsToPatch)
                    {
                        if (e.IsElementTriangle)
                        {
                            if (_elementsToSplit.Count!=0)
                            {
                                while (!_elementsToSplit.ContainsNodeID(e.Node_1))
                                {
                                    int tempID = e.Node_1;
                                    e.Node_1 = e.Node_2;
                                    e.Node_2 = e.Node_3;
                                    e.Node_3 = tempID;
                                }
                            } 
                            else
                            {
                                while (e.Node_1!=_dentingNodeID)
                                {
                                    int tempID = e.Node_1;
                                    e.Node_1 = e.Node_2;
                                    e.Node_2 = e.Node_3;
                                    e.Node_3 = tempID;
                                }
                            }
                            
                            
                            if (_elementsToSplit.ContainsNodeID(e.Node_2))
                            {
                                if (DistanceToCenter(e.Node_1)>DistanceToCenter(e.Node_2))
                                {
                                    int tempID = e.Node_1;
                                    e.Node_1 = e.Node_3;
                                    e.Node_3 = e.Node_2;
                                    e.Node_2 = tempID;
                                }
                            }
                            else if (_elementsToSplit.ContainsNodeID(e.Node_3))
                            {
                                if (DistanceToCenter(e.Node_3) > DistanceToCenter(e.Node_1))
                                {
                                    int tempID = e.Node_1;
                                    e.Node_1 = e.Node_2;
                                    e.Node_2 = e.Node_3;
                                    e.Node_3 = tempID;
                                }
                                else if (DistanceToCenter(e.Node_3) < DistanceToCenter(e.Node_1))
                                {
                                    int tempID = e.Node_1;
                                    e.Node_1 = e.Node_3;
                                    e.Node_3 = e.Node_2;
                                    e.Node_2 = tempID;
                                }
                            }
                        }
                    }
                }
                //再循环一次，扩大一圈
                _elementsToSplit.CombinElements(_elementsToPatch);
                _elementsToPatch = _elementsAll.FindElementsAttatchToNodes(_nodesAll.FindNodesAttatchToElements(_elementsToSplit));
                _elementsToPatch.ExceptElements(_elementsToSplit);

                _elementsToRemain = _elementsAll.ExceptElements(_elementsToSplit).ExceptElements(_elementsToPatch);
                //Console.WriteLine("{0},{1},{2}", ElementsToSplit.Count, ElementsToPatch.Count, ElementsToRemain.Count);
                return true;
            }
            else
            {
                //Console.WriteLine("{0},{1},{2}", ElementsToSplit.Count, ElementsToPatch.Count, ElementsToRemain.Count);
                return false;
            }
        }

        private Node GetNodeFromNodeID(int id)
        {
            Node tempNode=null;
            foreach (Node n in _nodesAll)
            {
                if (n.NodeID==id)
                {
                    tempNode = n;
                }
            }
            return tempNode;
        }
        private Node GetNodeFromNodeID(Nodes ns,int id)
        {
            Node tempNode = null;
            foreach (Node n in ns)
            {
                if (n.NodeID == id)
                {
                    tempNode = n;
                }
            }
            return tempNode;
        }

        private void SplitTheElements()
        {
            
            Elements ES = _elementsToPatch.CombinElements(_elementsToSplit);
            
            foreach (Element e in ES)
            {
                if (_elementsToSplit.ContainsElementID(e.ElementID))
                {
                    //四边形
                    if (!e.IsElementTriangle)
                    {
                        if (e.Node_5 == 0)
                        {
                            Node n5 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position) / 2, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position) / 2, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position) / 2);
                            _nodesAll.Add(n5);
                            e.Node_5 = n5.NodeID;
                            _currentElement = ES.FindElementUseTwoNode(e.Node_2, e.Node_1);

                            if (_currentElement != null)
                            {
                                if (_currentElement.Node_1 == e.Node_2)
                                {
                                    _currentElement.Node_5 = n5.NodeID;
                                }
                                if (_currentElement.Node_2 == e.Node_2)
                                {
                                    _currentElement.Node_6 = n5.NodeID;
                                }
                                if (_currentElement.Node_3 == e.Node_2)
                                {
                                    _currentElement.Node_7 = n5.NodeID;
                                }
                                if (_currentElement.Node_4 == e.Node_2)
                                {
                                    _currentElement.Node_8 = n5.NodeID;
                                }
                            }

                        }

                        if (e.Node_6 == 0)
                        {
                            Node n6 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position) / 2, (GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position) / 2, (GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position) / 2);
                            _nodesAll.Add(n6);
                            e.Node_6 = n6.NodeID;
                            _currentElement = ES.FindElementUseTwoNode(e.Node_3, e.Node_2);
                            if (_currentElement != null)
                            {
                                if (_currentElement.Node_1 == e.Node_3)
                                {
                                    _currentElement.Node_5 = n6.NodeID;
                                }
                                if (_currentElement.Node_2 == e.Node_3)
                                {
                                    _currentElement.Node_6 = n6.NodeID;
                                }
                                if (_currentElement.Node_3 == e.Node_3)
                                {
                                    _currentElement.Node_7 = n6.NodeID;
                                }
                                if (_currentElement.Node_4 == e.Node_3)
                                {
                                    _currentElement.Node_8 = n6.NodeID;
                                }
                            }

                        }

                        if (e.Node_7 == 0)
                        {
                            Node n7 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_3).X_position + GetNodeFromNodeID(e.Node_4).X_position) / 2, (GetNodeFromNodeID(e.Node_3).Y_position + GetNodeFromNodeID(e.Node_4).Y_position) / 2, (GetNodeFromNodeID(e.Node_3).Z_position + GetNodeFromNodeID(e.Node_4).Z_position) / 2);
                            _nodesAll.Add(n7);
                            e.Node_7 = n7.NodeID;
                            _currentElement = ES.FindElementUseTwoNode(e.Node_4, e.Node_3);

                            if (_currentElement != null)
                            {
                                if (_currentElement.Node_1 == e.Node_4)
                                {
                                    _currentElement.Node_5 = n7.NodeID;
                                }
                                if (_currentElement.Node_2 == e.Node_4)
                                {
                                    _currentElement.Node_6 = n7.NodeID;
                                }
                                if (_currentElement.Node_3 == e.Node_4)
                                {
                                    _currentElement.Node_7 = n7.NodeID;
                                }
                                if (_currentElement.Node_4 == e.Node_4)
                                {
                                    _currentElement.Node_8 = n7.NodeID;
                                }
                            }

                        }

                        if (e.Node_8 == 0)
                        {
                            Node n8 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_4).X_position + GetNodeFromNodeID(e.Node_1).X_position) / 2, (GetNodeFromNodeID(e.Node_4).Y_position + GetNodeFromNodeID(e.Node_1).Y_position) / 2, (GetNodeFromNodeID(e.Node_4).Z_position + GetNodeFromNodeID(e.Node_1).Z_position) / 2);
                            _nodesAll.Add(n8);
                            e.Node_8 = n8.NodeID;
                            _currentElement = ES.FindElementUseTwoNode(e.Node_1, e.Node_4);
                            if (_currentElement != null)
                            {
                                if (_currentElement.Node_1 == e.Node_1)
                                {
                                    _currentElement.Node_5 = n8.NodeID;
                                }
                                if (_currentElement.Node_2 == e.Node_1)
                                {
                                    _currentElement.Node_6 = n8.NodeID;
                                }
                                if (_currentElement.Node_3 == e.Node_1)
                                {
                                    _currentElement.Node_7 = n8.NodeID;
                                }
                                if (_currentElement.Node_4 == e.Node_1)
                                {
                                    _currentElement.Node_8 = n8.NodeID;
                                }
                            }

                        }

                        if (e.Node_9 == 0)
                        {
                            Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position + GetNodeFromNodeID(e.Node_4).X_position) / 4, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position + GetNodeFromNodeID(e.Node_4).Y_position) / 4, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position + GetNodeFromNodeID(e.Node_4).Z_position) / 4);
                            _nodesAll.Add(n9);
                            e.Node_9 = n9.NodeID;
                        }
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_9, e.Node_8);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_6, e.Node_9, e.Node_5);
                        _elementsToRemain.Add(e2);
                        Element e3 = new Element(beginElementID++, e.Node_3, e.Node_7, e.Node_9, e.Node_6);
                        _elementsToRemain.Add(e3);
                        Element e4 = new Element(beginElementID++, e.Node_4, e.Node_8, e.Node_9, e.Node_7);
                        _elementsToRemain.Add(e4);
                    }


                    if (e.IsElementTriangle)
                    {
                        if (e.Node_5 == 0)
                        {
                            Node n5 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position) / 2, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position) / 2, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position) / 2);
                            _nodesAll.Add(n5);
                            e.Node_5 = n5.NodeID;
                            _currentElement = ES.FindElementUseTwoNode(e.Node_2, e.Node_1);
                            if (_currentElement != null)
                            {
                                if (_currentElement.Node_1 == e.Node_2)
                                {
                                    _currentElement.Node_5 = n5.NodeID;
                                }
                                if (_currentElement.Node_2 == e.Node_2)
                                {
                                    _currentElement.Node_6 = n5.NodeID;
                                }
                                if (_currentElement.Node_3 == e.Node_2)
                                {
                                    _currentElement.Node_7 = n5.NodeID;
                                }
                                if (_currentElement.Node_4 == e.Node_2)
                                {
                                    _currentElement.Node_8 = n5.NodeID;
                                }
                            }

                        }

                        if (e.Node_6 == 0)
                        {
                            Node n6 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position) / 2, (GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position) / 2, (GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position) / 2);
                            _nodesAll.Add(n6);
                            e.Node_6 = n6.NodeID;
                            _currentElement = ES.FindElementUseTwoNode(e.Node_3, e.Node_2);
                            if (_currentElement != null)
                            {
                                if (_currentElement.Node_1 == e.Node_3)
                                {
                                    _currentElement.Node_5 = n6.NodeID;
                                }
                                if (_currentElement.Node_2 == e.Node_3)
                                {
                                    _currentElement.Node_6 = n6.NodeID;
                                }
                                if (_currentElement.Node_3 == e.Node_3)
                                {
                                    _currentElement.Node_7 = n6.NodeID;
                                }
                                if (_currentElement.Node_4 == e.Node_3)
                                {
                                    _currentElement.Node_8 = n6.NodeID;
                                }
                            }

                        }

                        if (e.Node_7 == 0)
                        {
                            Node n7 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_3).X_position + GetNodeFromNodeID(e.Node_1).X_position) / 2, (GetNodeFromNodeID(e.Node_3).Y_position + GetNodeFromNodeID(e.Node_1).Y_position) / 2, (GetNodeFromNodeID(e.Node_3).Z_position + GetNodeFromNodeID(e.Node_1).Z_position) / 2);
                            _nodesAll.Add(n7);
                            e.Node_7 = n7.NodeID;
                            _currentElement = ES.FindElementUseTwoNode(e.Node_1, e.Node_3);
                            if (_currentElement != null)
                            {
                                if (_currentElement.Node_1 == e.Node_1)
                                {
                                    _currentElement.Node_5 = n7.NodeID;
                                }
                                if (_currentElement.Node_2 == e.Node_1)
                                {
                                    _currentElement.Node_6 = n7.NodeID;
                                }
                                if (_currentElement.Node_3 == e.Node_1)
                                {
                                    _currentElement.Node_7 = n7.NodeID;
                                }
                                if (_currentElement.Node_4 == e.Node_1)
                                {
                                    _currentElement.Node_8 = n7.NodeID;
                                }
                            }

                        }


                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_7);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_6, e.Node_7, e.Node_5);
                        _elementsToRemain.Add(e2);
                        Element e3 = new Element(beginElementID++, e.Node_3, e.Node_7, e.Node_6);
                        _elementsToRemain.Add(e3);
                    }
                }
                
            }
            _elementsToPatch.ExceptElements(_elementsToSplit);
            _elementsAll = _elementsToRemain.CombinElements(_elementsToPatch);
            
        }

        private void FormatPatchElements()
        {
            foreach(Element e in _elementsToPatch)
            {
                if (!e.IsElementTriangle)
                {
                    if (e.Node_5!=0 ||e.Node_6!=0 ||e.Node_7!=0 ||e.Node_8!=0 )
                    {
                        while (e.Node_5 == 0 || e.Node_8 != 0)
                        {
                            int tempID = e.Node_1;
                            e.Node_1 = e.Node_2;
                            e.Node_2 = e.Node_3;
                            e.Node_3 = e.Node_4;
                            e.Node_4 = tempID;
                            tempID = e.Node_5;
                            e.Node_5 = e.Node_6;
                            e.Node_6 = e.Node_7;
                            e.Node_7 = e.Node_8;
                            e.Node_8 = tempID;
                        }
                    }
                    else//共一个节点的角上的单元
                    {
                        while (!_elementsToSplit.ContainsNodeID(e.Node_1))
                        {
                            int tempID = e.Node_1;
                            e.Node_1 = e.Node_2;
                            e.Node_2 = e.Node_3;
                            e.Node_3 = e.Node_4;
                            e.Node_4 = tempID;
                            tempID = e.Node_5;
                            e.Node_5 = e.Node_6;
                            e.Node_6 = e.Node_7;
                            e.Node_7 = e.Node_8;
                            e.Node_8 = tempID;
                        }
                    }
                    //e.Show();
                } 
                else if(e.IsElementTriangle)
                {
                    if (e.Node_5 != 0 || e.Node_6 != 0 || e.Node_7 != 0)
                    {
                        while (e.Node_5 == 0 || e.Node_7 != 0)
                        {
                            int tempID = e.Node_1;
                            e.Node_1 = e.Node_2;
                            e.Node_2 = e.Node_3;
                            e.Node_3 = tempID;
                            tempID = e.Node_5;
                            e.Node_5 = e.Node_6;
                            e.Node_6 = e.Node_7;
                            e.Node_7 = tempID;
                        }
                    }
                    else
                    {
                        while (!_elementsToSplit.ContainsNodeID(e.Node_1))
                        {
                            int tempID = e.Node_1;
                            e.Node_1 = e.Node_2;
                            e.Node_2 = e.Node_3;
                            e.Node_3 = tempID;
                            tempID = e.Node_5;
                            e.Node_5 = e.Node_6;
                            e.Node_6 = e.Node_7;
                            e.Node_7 = tempID;
                        }
                    }
                    //e.Show();
                }
            }
        }   //已经通过验证

        private void ListPatchElements()
        {
            Elements ES = new Elements();
            foreach (Element e in _elementsToPatch)
            {
                if (!e.IsElementTriangle && _elementsToPatch.FindElementUseTwoNode(e.Node_1,e.Node_4)==null)
                {
                    _currentElement = e;
                    break;
                }
                else if (e.IsElementTriangle && _elementsToPatch.FindElementUseTwoNode(e.Node_1, e.Node_3) == null)
                {
                    _currentElement = e;
                    break;
                }
                else
                {
                    _currentElement = e;
                }
            }
            
            while (ES.Count != _elementsToPatch.Count)
            {
                //Console.WriteLine("*********:::::  {0}", _currentElement.ElementID);
                ES.Add(_currentElement);
                if (_currentElement.Node_5==0)
                {
                    _currentElement = _elementsToPatch.FindElementUseTwoNode(_currentElement.Node_2, _currentElement.Node_1);
                }
                else if (_currentElement.Node_5!=0 &&_currentElement.Node_6==0)
                {
                    _currentElement = _elementsToPatch.FindElementUseTwoNode(_currentElement.Node_3, _currentElement.Node_2);
                }
                else if (!_currentElement.IsElementTriangle && _currentElement.Node_5 != 0 && _currentElement.Node_6 != 0 && _currentElement.Node_7 == 0)
                {
                    _currentElement = _elementsToPatch.FindElementUseTwoNode(_currentElement.Node_4, _currentElement.Node_3);
                }
                else if (_currentElement.IsElementTriangle && _currentElement.Node_5 != 0 && _currentElement.Node_6 != 0 && _currentElement.Node_7 == 0)
                {
                    _currentElement = _elementsToPatch.FindElementUseTwoNode(_currentElement.Node_1, _currentElement.Node_3);
                    _currentElement = _elementsToPatch.FindElementUseTwoNode(_currentElement.Node_3, _currentElement.Node_2);
                }
                else if (!_currentElement.IsElementTriangle && _currentElement.Node_5 != 0 && _currentElement.Node_6 != 0 && _currentElement.Node_7 != 0 && _currentElement.Node_8 == 0)
                {
                    _currentElement = _elementsToPatch.FindElementUseTwoNode(_currentElement.Node_1, _currentElement.Node_4); 
                    _currentElement = _elementsToPatch.FindElementUseTwoNode(_currentElement.Node_3, _currentElement.Node_2);
                }

            }
            _elementsToPatch = ES;
        }


        private void PatchTheElements()
        {
            ////////////////////////////////////////////
            FormatPatchElements();
            ListPatchElements();
            _elementsToRemain.ExceptElements(_elementsToPatch);
            ////////////////////////////////////////////
            //以上代码固定，不能动
            ////////////////////////////////////////////


            for (int i = 0; i < _elementsToPatch.Count-1;i++ )
            {
                _currentElement = _elementsToPatch[i];
                Element e = _elementsToPatch[i];
                _nextElement = _elementsToPatch[i + 1];


                if (!_currentElement.IsElementTriangle)
                {
                    //四边形代码
                    #region 四边形工况一

                    if (e.Node_5!=0 &&e.Node_6==0 &&e.Node_7==0 &&e.Node_8==0 )
                    {
                        Node n6 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position) / 2, (GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position) / 2, (GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position) / 2);
                        _nodesAll.Add(n6);
                        e.Node_6 = n6.NodeID;

                        if (_nextElement.IsElementTriangle)
                        {
                            _nextElement.Node_7 = n6.NodeID;
                        } 
                        else if(!_nextElement.IsElementTriangle)
                        {
                            _nextElement.Node_8 = n6.NodeID;
                        }

                        if (e.Node_9 == 0)
                        {
                            Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position + GetNodeFromNodeID(e.Node_4).X_position) / 4, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position + GetNodeFromNodeID(e.Node_4).Y_position) / 4, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position + GetNodeFromNodeID(e.Node_4).Z_position) / 4);
                            _nodesAll.Add(n9);
                            e.Node_9 = n9.NodeID;
                        }
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_9, e.Node_4);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_6, e.Node_9, e.Node_5);
                        _elementsToRemain.Add(e2);
                        Element e3 = new Element(beginElementID++, e.Node_3, e.Node_4, e.Node_9, e.Node_6);
                        _elementsToRemain.Add(e3);
                    }
                    #endregion

                    #region 四边形工况2
                    else if (e.Node_5 != 0 && e.Node_6 == 0 && e.Node_7 == 0 && e.Node_8 != 0)
                    {
                        if (e.Node_9 == 0)
                        {
                            Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position + GetNodeFromNodeID(e.Node_4).X_position) / 4, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position + GetNodeFromNodeID(e.Node_4).Y_position) / 4, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position + GetNodeFromNodeID(e.Node_4).Z_position) / 4);
                            _nodesAll.Add(n9);
                            e.Node_9 = n9.NodeID;
                        }
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_9, e.Node_8);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_3, e.Node_9, e.Node_5);
                        _elementsToRemain.Add(e2);
                        Element e3 = new Element(beginElementID++, e.Node_3, e.Node_4, e.Node_8, e.Node_9);
                        _elementsToRemain.Add(e3);
                    }
                    #endregion

                    #region 四边形工况3
                    else if (e.Node_5 != 0 && e.Node_6 != 0 && e.Node_7 == 0 && e.Node_8 == 0)
                    {
                        if (e.Node_9 == 0)
                        {
                            Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position + GetNodeFromNodeID(e.Node_4).X_position) / 4, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position + GetNodeFromNodeID(e.Node_4).Y_position) / 4, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position + GetNodeFromNodeID(e.Node_4).Z_position) / 4);
                            _nodesAll.Add(n9);
                            e.Node_9 = n9.NodeID;
                        }
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_9, e.Node_4);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_6, e.Node_9, e.Node_5);
                        _elementsToRemain.Add(e2);
                        Element e3 = new Element(beginElementID++, e.Node_3, e.Node_4, e.Node_9, e.Node_6);
                        _elementsToRemain.Add(e3);
                    }
                    #endregion

                    #region 四边形工况4
                    else if (e.Node_5 != 0 && e.Node_6 != 0 && e.Node_7 == 0 && e.Node_8 != 0)
                    {
                        Node n7 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_3).X_position + GetNodeFromNodeID(e.Node_4).X_position) / 2, (GetNodeFromNodeID(e.Node_3).Y_position + GetNodeFromNodeID(e.Node_4).Y_position) / 2, (GetNodeFromNodeID(e.Node_3).Z_position + GetNodeFromNodeID(e.Node_4).Z_position) / 2);
                        _nodesAll.Add(n7);
                        e.Node_7 = n7.NodeID;

                        if (_nextElement.IsElementTriangle)
                        {
                            _nextElement.Node_7 = n7.NodeID;
                        }
                        else if (!_nextElement.IsElementTriangle)
                        {
                            _nextElement.Node_8 = n7.NodeID;
                        }

                        if (e.Node_9 == 0)
                        {
                            Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position + GetNodeFromNodeID(e.Node_4).X_position) / 4, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position + GetNodeFromNodeID(e.Node_4).Y_position) / 4, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position + GetNodeFromNodeID(e.Node_4).Z_position) / 4);
                            _nodesAll.Add(n9);
                            e.Node_9 = n9.NodeID;
                        }
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_9, e.Node_8);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_6, e.Node_9, e.Node_5);
                        _elementsToRemain.Add(e2);
                        Element e3 = new Element(beginElementID++, e.Node_3, e.Node_7, e.Node_9, e.Node_6);
                        _elementsToRemain.Add(e3);
                        Element e4 = new Element(beginElementID++, e.Node_4, e.Node_8, e.Node_9, e.Node_7);
                        _elementsToRemain.Add(e4);
                    }
                    #endregion

                    else if (e.Node_5 == 0 && e.Node_6 == 0 && e.Node_7 == 0 && e.Node_8 == 0)
                    {
                        _elementsToRemain.Add(e);//工况5简单，不折叠代码了
                    }
                    #region 四边形工况6
                    else if (e.Node_5 == 0 && e.Node_6 == 0 && e.Node_7 == 0 && e.Node_8 != 0)
                    {
                        Node n5 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position) / 2, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position) / 2, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position) / 2);
                        _nodesAll.Add(n5);
                        e.Node_5 = n5.NodeID;

                        if (_nextElement.IsElementTriangle)
                        {
                            _nextElement.Node_7 = n5.NodeID;
                        }
                        else if (!_nextElement.IsElementTriangle)
                        {
                            _nextElement.Node_8 = n5.NodeID;
                        }

                        if (e.Node_9 == 0)
                        {
                            Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position + GetNodeFromNodeID(e.Node_4).X_position) / 4, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position + GetNodeFromNodeID(e.Node_4).Y_position) / 4, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position + GetNodeFromNodeID(e.Node_4).Z_position) / 4);
                            _nodesAll.Add(n9);
                            e.Node_9 = n9.NodeID;
                        }
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_9, e.Node_8);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_3, e.Node_9, e.Node_5);
                        _elementsToRemain.Add(e2);
                        Element e3 = new Element(beginElementID++, e.Node_3, e.Node_4, e.Node_8, e.Node_9);
                        _elementsToRemain.Add(e3);


                    }
                    #endregion

                    #region 四边形工况7
                    else if (e.Node_5 != 0 && e.Node_6 != 0 && e.Node_7 != 0 && e.Node_8 == 0)
                    {
                        if (e.Node_9 == 0)
                        {
                            Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position + GetNodeFromNodeID(e.Node_4).X_position) / 4, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position + GetNodeFromNodeID(e.Node_4).Y_position) / 4, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position + GetNodeFromNodeID(e.Node_4).Z_position) / 4);
                            _nodesAll.Add(n9);
                            e.Node_9 = n9.NodeID;
                        }
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_9);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_6, e.Node_9, e.Node_5);
                        _elementsToRemain.Add(e2);
                        Element e3 = new Element(beginElementID++, e.Node_3, e.Node_7, e.Node_9, e.Node_6);
                        _elementsToRemain.Add(e3);
                        Element e4 = new Element(beginElementID++, e.Node_4, e.Node_1, e.Node_9, e.Node_7);
                        _elementsToRemain.Add(e4);


                    }
                    #endregion
                    #region 四边形工况8
                    else if (e.Node_5 != 0 && e.Node_6 != 0 && e.Node_7 != 0 && e.Node_8 != 0)
                    {
                        if (e.Node_9 == 0)
                        {
                            Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position + GetNodeFromNodeID(e.Node_4).X_position) / 4, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position + GetNodeFromNodeID(e.Node_4).Y_position) / 4, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position + GetNodeFromNodeID(e.Node_4).Z_position) / 4);
                            _nodesAll.Add(n9);
                            e.Node_9 = n9.NodeID;
                        }
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_9, e.Node_8);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_6, e.Node_9, e.Node_5);
                        _elementsToRemain.Add(e2);
                        Element e3 = new Element(beginElementID++, e.Node_3, e.Node_7, e.Node_9, e.Node_6);
                        _elementsToRemain.Add(e3);
                        Element e4 = new Element(beginElementID++, e.Node_4, e.Node_8, e.Node_9, e.Node_7);
                        _elementsToRemain.Add(e4);


                    }
                    #endregion

                }
                else if (_currentElement.IsElementTriangle)
                {
                    //三角形的代码
                    if (e.Node_5 != 0 && e.Node_6 == 0 && e.Node_7 == 0)
                    {
                        Node n6 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_2).X_position + GetNodeFromNodeID(e.Node_3).X_position) / 2, (GetNodeFromNodeID(e.Node_2).Y_position + GetNodeFromNodeID(e.Node_3).Y_position) / 2, (GetNodeFromNodeID(e.Node_2).Z_position + GetNodeFromNodeID(e.Node_3).Z_position) / 2);
                        _nodesAll.Add(n6);
                        e.Node_6 = n6.NodeID;

                        if (_nextElement.IsElementTriangle)
                        {
                            _nextElement.Node_7 = n6.NodeID;
                        }
                        else if (!_nextElement.IsElementTriangle)
                        {
                            _nextElement.Node_8 = n6.NodeID;
                        }
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_6, e.Node_3);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_6, e.Node_5);
                        _elementsToRemain.Add(e2);
                    }
                    else if (e.Node_5 != 0 && e.Node_6 == 0 && e.Node_7 != 0)
                    {
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_7);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_3, e.Node_7, e.Node_5);
                        _elementsToRemain.Add(e2);
                    }
                    else if (e.Node_5 == 0 && e.Node_6 == 0 && e.Node_7 == 0)
                    {
                        _elementsToRemain.Add(e);
                    }
                    if (e.Node_5 == 0 && e.Node_6 == 0 && e.Node_7 != 0)
                    {
                        Node n5 = new Node(beginNodeID++, (GetNodeFromNodeID(e.Node_1).X_position + GetNodeFromNodeID(e.Node_2).X_position) / 2, (GetNodeFromNodeID(e.Node_1).Y_position + GetNodeFromNodeID(e.Node_2).Y_position) / 2, (GetNodeFromNodeID(e.Node_1).Z_position + GetNodeFromNodeID(e.Node_2).Z_position) / 2);
                        _nodesAll.Add(n5);
                        e.Node_5 = n5.NodeID;

                        if (_nextElement.IsElementTriangle)
                        {
                            _nextElement.Node_7 = n5.NodeID;
                        }
                        else if (!_nextElement.IsElementTriangle)
                        {
                            _nextElement.Node_8 = n5.NodeID;
                        }
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_7);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_3, e.Node_7, e.Node_5);
                        _elementsToRemain.Add(e2);
                    }
                    else if (e.Node_5 != 0 && e.Node_6 != 0 && e.Node_7 == 0)
                    {
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_6,e.Node_3);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_6, e.Node_5);
                        _elementsToRemain.Add(e2);
                    }
                    else if (e.Node_5 != 0 && e.Node_6 != 0 && e.Node_7 != 0)
                    {
                        Element e1 = new Element(beginElementID++, e.Node_1, e.Node_5, e.Node_6, e.Node_7);
                        _elementsToRemain.Add(e1);
                        Element e2 = new Element(beginElementID++, e.Node_2, e.Node_6, e.Node_5);
                        _elementsToRemain.Add(e2);
                        Element e3 = new Element(beginElementID++, e.Node_3, e.Node_7, e.Node_6);
                        _elementsToRemain.Add(e3);
                    }
                }
            }


            //补最后一个单元的代码
            Element z =_elementsToPatch[_elementsToPatch.Count - 1];
            if (!z.IsElementTriangle)
            {
                if (z.Node_5 != 0 && z.Node_6 == 0 && z.Node_7 == 0 && z.Node_8 == 0)
                {
                    if (z.Node_9 == 0)
                    {
                        Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(z.Node_1).X_position + GetNodeFromNodeID(z.Node_2).X_position + GetNodeFromNodeID(z.Node_3).X_position + GetNodeFromNodeID(z.Node_4).X_position) / 4, (GetNodeFromNodeID(z.Node_1).Y_position + GetNodeFromNodeID(z.Node_2).Y_position + GetNodeFromNodeID(z.Node_3).Y_position + GetNodeFromNodeID(z.Node_4).Y_position) / 4, (GetNodeFromNodeID(z.Node_1).Z_position + GetNodeFromNodeID(z.Node_2).Z_position + GetNodeFromNodeID(z.Node_3).Z_position + GetNodeFromNodeID(z.Node_4).Z_position) / 4);
                        _nodesAll.Add(n9);
                        z.Node_9 = n9.NodeID;
                    }
                    Element e1 = new Element(beginElementID++, z.Node_1, z.Node_5, z.Node_9, z.Node_4);
                    _elementsToRemain.Add(e1);
                    Element e2 = new Element(beginElementID++, z.Node_2, z.Node_3, z.Node_9, z.Node_5);
                    _elementsToRemain.Add(e2);
                    Element e3 = new Element(beginElementID++, z.Node_3, z.Node_4, z.Node_9);
                    _elementsToRemain.Add(e3);
                }
                else if (z.Node_5 != 0 && z.Node_6 == 0 && z.Node_7 == 0 && z.Node_8 != 0)
                {
                    if (z.Node_9 == 0)
                    {
                        Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(z.Node_1).X_position + GetNodeFromNodeID(z.Node_2).X_position + GetNodeFromNodeID(z.Node_3).X_position + GetNodeFromNodeID(z.Node_4).X_position) / 4, (GetNodeFromNodeID(z.Node_1).Y_position + GetNodeFromNodeID(z.Node_2).Y_position + GetNodeFromNodeID(z.Node_3).Y_position + GetNodeFromNodeID(z.Node_4).Y_position) / 4, (GetNodeFromNodeID(z.Node_1).Z_position + GetNodeFromNodeID(z.Node_2).Z_position + GetNodeFromNodeID(z.Node_3).Z_position + GetNodeFromNodeID(z.Node_4).Z_position) / 4);
                        _nodesAll.Add(n9);
                        z.Node_9 = n9.NodeID;
                    }
                    Element e1 = new Element(beginElementID++, z.Node_1, z.Node_5, z.Node_9, z.Node_8);
                    _elementsToRemain.Add(e1);
                    Element e2 = new Element(beginElementID++, z.Node_2, z.Node_3, z.Node_9, z.Node_5);
                    _elementsToRemain.Add(e2);
                    Element e3 = new Element(beginElementID++, z.Node_3, z.Node_4, z.Node_8, z.Node_9);
                    _elementsToRemain.Add(e3);
                }
                else if (z.Node_5 != 0 && z.Node_6 != 0 && z.Node_7 == 0 && z.Node_8 == 0)
                {
                    if (z.Node_9 == 0)
                    {
                        Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(z.Node_1).X_position + GetNodeFromNodeID(z.Node_2).X_position + GetNodeFromNodeID(z.Node_3).X_position + GetNodeFromNodeID(z.Node_4).X_position) / 4, (GetNodeFromNodeID(z.Node_1).Y_position + GetNodeFromNodeID(z.Node_2).Y_position + GetNodeFromNodeID(z.Node_3).Y_position + GetNodeFromNodeID(z.Node_4).Y_position) / 4, (GetNodeFromNodeID(z.Node_1).Z_position + GetNodeFromNodeID(z.Node_2).Z_position + GetNodeFromNodeID(z.Node_3).Z_position + GetNodeFromNodeID(z.Node_4).Z_position) / 4);
                        _nodesAll.Add(n9);
                        z.Node_9 = n9.NodeID;
                    }
                    Element e1 = new Element(beginElementID++, z.Node_1, z.Node_5, z.Node_9, z.Node_4);
                    _elementsToRemain.Add(e1);
                    Element e2 = new Element(beginElementID++, z.Node_2, z.Node_6, z.Node_9, z.Node_5);
                    _elementsToRemain.Add(e2);
                    Element e3 = new Element(beginElementID++, z.Node_3, z.Node_4, z.Node_9, z.Node_6);
                    _elementsToRemain.Add(e3);
                }
                else if (z.Node_5 != 0 && z.Node_6 != 0 && z.Node_7 == 0 && z.Node_8 != 0)
                {
                    if (z.Node_9 == 0)
                    {
                        Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(z.Node_1).X_position + GetNodeFromNodeID(z.Node_2).X_position + GetNodeFromNodeID(z.Node_3).X_position + GetNodeFromNodeID(z.Node_4).X_position) / 4, (GetNodeFromNodeID(z.Node_1).Y_position + GetNodeFromNodeID(z.Node_2).Y_position + GetNodeFromNodeID(z.Node_3).Y_position + GetNodeFromNodeID(z.Node_4).Y_position) / 4, (GetNodeFromNodeID(z.Node_1).Z_position + GetNodeFromNodeID(z.Node_2).Z_position + GetNodeFromNodeID(z.Node_3).Z_position + GetNodeFromNodeID(z.Node_4).Z_position) / 4);
                        _nodesAll.Add(n9);
                        z.Node_9 = n9.NodeID;
                    }
                    Element e1 = new Element(beginElementID++, z.Node_1, z.Node_5, z.Node_9, z.Node_8);
                    _elementsToRemain.Add(e1);
                    Element e2 = new Element(beginElementID++, z.Node_2, z.Node_6, z.Node_9, z.Node_5);
                    _elementsToRemain.Add(e2);
                    Element e3 = new Element(beginElementID++, z.Node_3, z.Node_4, z.Node_9, z.Node_6);
                    _elementsToRemain.Add(e3);
                    Element e4 = new Element(beginElementID++, z.Node_4, z.Node_8, z.Node_9);
                    _elementsToRemain.Add(e4);
                }
                else if (z.Node_5 == 0 && z.Node_6 == 0 && z.Node_7 == 0 && z.Node_8 == 0)
                {
                    _elementsToRemain.Add(z);
                }
                else if (z.Node_5 == 0 && z.Node_6 == 0 && z.Node_7 == 0 && z.Node_8 != 0)
                {
                    if (z.Node_9 == 0)
                    {
                        Node n9 = new Node(beginNodeID++, (GetNodeFromNodeID(z.Node_1).X_position + GetNodeFromNodeID(z.Node_2).X_position + GetNodeFromNodeID(z.Node_3).X_position + GetNodeFromNodeID(z.Node_4).X_position) / 4, (GetNodeFromNodeID(z.Node_1).Y_position + GetNodeFromNodeID(z.Node_2).Y_position + GetNodeFromNodeID(z.Node_3).Y_position + GetNodeFromNodeID(z.Node_4).Y_position) / 4, (GetNodeFromNodeID(z.Node_1).Z_position + GetNodeFromNodeID(z.Node_2).Z_position + GetNodeFromNodeID(z.Node_3).Z_position + GetNodeFromNodeID(z.Node_4).Z_position) / 4);
                        _nodesAll.Add(n9);
                        z.Node_9 = n9.NodeID;
                    }
                    Element e1 = new Element(beginElementID++, z.Node_1, z.Node_2, z.Node_9, z.Node_8);
                    _elementsToRemain.Add(e1);
                    Element e2 = new Element(beginElementID++, z.Node_2, z.Node_3, z.Node_9);
                    _elementsToRemain.Add(e2);
                    Element e3 = new Element(beginElementID++, z.Node_3, z.Node_4, z.Node_8, z.Node_9);
                    _elementsToRemain.Add(e3);
                }
            }
            else if (z.IsElementTriangle)
            {
                if (z.Node_5 != 0 && z.Node_6 == 0 && z.Node_7 == 0 )
                {
                    Element e1 = new Element(beginElementID++, z.Node_1, z.Node_5, z.Node_3);
                    _elementsToRemain.Add(e1);
                    Element e2 = new Element(beginElementID++, z.Node_2, z.Node_3, z.Node_5);
                    _elementsToRemain.Add(e2);
                }
                else if (z.Node_5 != 0 && z.Node_6 == 0 && z.Node_7 != 0)
                {
                    Element e1 = new Element(beginElementID++, z.Node_1, z.Node_5, z.Node_7);
                    _elementsToRemain.Add(e1);
                    Element e2 = new Element(beginElementID++, z.Node_2, z.Node_3, z.Node_7, z.Node_5);
                    _elementsToRemain.Add(e2);
                }
                else if (z.Node_5 == 0 && z.Node_6 == 0 && z.Node_7 == 0)
                {
                    _elementsToRemain.Add(z);
                }
                else if (z.Node_5 == 0 && z.Node_6 == 0 && z.Node_7 != 0)
                {
                    Element e1 = new Element(beginElementID++, z.Node_1, z.Node_2, z.Node_7);
                    _elementsToRemain.Add(e1);
                    Element e2 = new Element(beginElementID++, z.Node_2, z.Node_3, z.Node_7);
                    _elementsToRemain.Add(e2);
                }
                else if (z.Node_5 != 0 && z.Node_6 != 0 && z.Node_7 == 0)
                {
                    Element e1 = new Element(beginElementID++, z.Node_1, z.Node_5, z.Node_6, z.Node_3);
                    _elementsToRemain.Add(e1);
                    Element e2 = new Element(beginElementID++, z.Node_2, z.Node_6, z.Node_5);
                    _elementsToRemain.Add(e2);
                }
                else if (z.Node_5 != 0 && z.Node_6 != 0 && z.Node_7 != 0)
                {
                    Element e1 = new Element(beginElementID++, z.Node_1, z.Node_5, z.Node_6, z.Node_7);
                    _elementsToRemain.Add(e1);
                    Element e2 = new Element(beginElementID++, z.Node_2, z.Node_6, z.Node_5);
                    _elementsToRemain.Add(e2);
                    Element e3 = new Element(beginElementID++, z.Node_3, z.Node_7, z.Node_6);
                    _elementsToRemain.Add(e3);
                }

            }



            /////////////////////////////////////
            //以下两行代码不能删除，保留到最后
            ////////////////////////////////////
            _elementsToPatch.Clear();
            _elementsToSplit.Clear();
            _elementsAll = _elementsToRemain;
            /////////////////////////////////////
        }

        public VectorXYZ GetVector()
        {
            VectorXYZ v = new VectorXYZ();
            TRS trs=new TRS();
            _elementsToPatch = _elementsAll.FindElementsOnOneNode(_dentingNodeID);
            //为计算法向，新增格式化周边网格代码，2014年11月2日
            foreach (Element e in _elementsToPatch)
            {
                if (!e.IsElementTriangle)
                {
                    while (e.Node_1 != _dentingNodeID)
                    {
                        int tempID = e.Node_1;
                        e.Node_1 = e.Node_2;
                        e.Node_2 = e.Node_3;
                        e.Node_3 = e.Node_4;
                        e.Node_4 = tempID;
                    }
                }
                if (e.IsElementTriangle)
                {
                    VectorXYZ va = trs.GetTranslateXYZ(_nodesAll.GetNodeFromNodeID(e.Node_1), _nodesAll.GetNodeFromNodeID(e.Node_2));
                    VectorXYZ vb = trs.GetTranslateXYZ(_nodesAll.GetNodeFromNodeID(e.Node_1), _nodesAll.GetNodeFromNodeID(e.Node_3));
                    v.x += trs.GetVectorX(va, vb).x;
                    v.y += trs.GetVectorX(va, vb).y;
                    v.z += trs.GetVectorX(va, vb).z;
                }
                else if (!e.IsElementTriangle)
                {
                    VectorXYZ va = trs.GetTranslateXYZ(_nodesAll.GetNodeFromNodeID(e.Node_1), _nodesAll.GetNodeFromNodeID(e.Node_2));
                    VectorXYZ vb = trs.GetTranslateXYZ(_nodesAll.GetNodeFromNodeID(e.Node_1), _nodesAll.GetNodeFromNodeID(e.Node_4));
                    v.x += trs.GetVectorX(va, vb).x;
                    v.y += trs.GetVectorX(va, vb).y;
                    v.z += trs.GetVectorX(va, vb).z;
                }
            }
            v.x *= 20;
            v.y *= 20;
            v.z *= 20;
            return v;
        }

        public void Run()
        {
            
            for (int i = 0; i < SplitCounts;i++ )
            {
                GroupElements();
                SplitTheElements();
                PatchTheElements();
            }
            WritePartBIncludeFile();
            WritePartCIncludeFile();

            


            //测试结束
            OutInputFile();
        }


        private void OutInputFile()
        {
            StreamWriter sw = new StreamWriter(Form1.OutputFileDirectory+"//"+Path.GetFileNameWithoutExtension(Form1.InpFileFullPath)+"_N"+_dentingNodeID+".inp");
            sw.WriteLine(@"*INCLUDE, INPUT=.\includeFiles\partA.inp");
            sw.WriteLine(@"*INCLUDE, INPUT=.\includeFiles\partB_N" + _dentingNodeID + ".inp");
            sw.WriteLine(@"*INCLUDE, INPUT=.\includeFiles\partC_N" + _dentingNodeID + ".inp");
            
            //以下部分纯手写代码,第一部分
            sw.WriteLine("**HMNAME SYSTEMCOL  auto1,  99990001,    4");
            sw.WriteLine("*TRANSFORM, TYPE=R, NSET=David_NodeSet");
            double[] sys = new double[6];
            Node yuandian = GetNodeFromNodeID(nsImpactor,99999999);
            Node nodeToX = GetNodeFromNodeID(nsImpactor, 99999998);
            Node nodeToY = GetNodeFromNodeID(nsImpactor, 99999997);
            sys[0] = nodeToX.X_position - yuandian.X_position;
            sys[1] = nodeToX.Y_position - yuandian.Y_position;
            sys[2] = nodeToX.Z_position - yuandian.Z_position;
            sys[3] = nodeToY.X_position - yuandian.X_position;
            sys[4] = nodeToY.Y_position - yuandian.Y_position;
            sys[5] = nodeToY.Z_position - yuandian.Z_position;

            sw.WriteLine("{0},{1},{2},{3},{4},{5}", sys[0], sys[1], sys[2], sys[3], sys[4], sys[5]);
            sw.WriteLine("**HMORIENT ORIGIN  {0},{1},{2}",yuandian.X_position,yuandian.Y_position,yuandian.Z_position);
            sw.WriteLine("**HM_Rigid_Body \"Rigid_Impactor\"          4");
            sw.WriteLine("*RIGID BODY, REF NODE =   99999999, ELSET = Rigid_Impactor");
            sw.WriteLine("*NSET, NSET=David_NodeSet");
            sw.WriteLine("  99999999,");
            //手写结束


            //读取剩余部分
            string tempInputFile = Form1.ImpactorFileFullPath + ".david";
            File.Copy(Form1.ImpactorFileFullPath, tempInputFile);
            StreamReader sr = new StreamReader(tempInputFile);

            bool canReadNode = false;
            string s = sr.ReadLine();
            while (s != null)
            {
                if (canReadNode)
                {
                    //关键代码添加位置
                    sw.WriteLine(s);
                    if (s=="*SURFACE, NAME = s, TYPE = ELEMENT")
                    {
                         sw.WriteLine(@"*INCLUDE, INPUT=.\includeFiles\partD_N" + _dentingNodeID + ".inp");
                    }
                    else if (s == "*BOUNDARY")
                    {
                        sw.WriteLine(@"*INCLUDE, INPUT=.\includeFiles\const.inp");
                    }

                }
                if (s == "  99999999,")
                {
                    canReadNode = true;
                }
                s = sr.ReadLine();
            }
            sr.Close();
            File.Delete(tempInputFile); 


            
            //
            sw.Close();

        }


        public void WritePartBIncludeFile()
        {
            StreamWriter sw = new StreamWriter(Form1.IncludeFileDirectory + "\\PartB_N" + _dentingNodeID + ".inp");
            StreamWriter swd = new StreamWriter(Form1.IncludeFileDirectory + "\\PartD_N" + _dentingNodeID + ".inp");
            sw.WriteLine("*NODE");
            foreach (Node n in _nodesAll)
            {
                if(n.NodeID>99900000)
                    sw.WriteLine("{0},{1},{2},{3}", n.NodeID.ToString().PadLeft(10), n.X_position.ToString().PadLeft(15), n.Y_position.ToString().PadLeft(15), n.Z_position.ToString().PadLeft(15));
            }

            //小球的代码
            Node nb = new Node(0, 0, 0, 0);
            TRS trs = new TRS();
            GetVector();
            RotateAngleXY r = trs.GetRotateAngleXY(GetVector());
            VectorXYZ t = trs.GetTranslateXYZ(nb, _nodesAll.GetNodeFromNodeID(_dentingNodeID));

            
            nsImpactor.CloneFromNodes(Form1.NodeOfImpactor);
            foreach (Node n in nsImpactor)
            {
                    n.RotateX(r.xRotate).RotateY(r.yRotate).Trans(t);
                    sw.WriteLine("{0},{1},{2},{3}", n.NodeID.ToString().PadLeft(10), n.X_position.ToString().PadLeft(15), n.Y_position.ToString().PadLeft(15), n.Z_position.ToString().PadLeft(15));
            }
            //表面单元的代码
            sw.WriteLine("*ELEMENT,TYPE=S3,ELSET="+Form1.CompNameOnDentingSurface);
            foreach (Element et in _elementsAll)
            {
                if (et.IsElementTriangle)
                {
                        sw.WriteLine("{0},{1},{2},{3}", et.ElementID.ToString().PadLeft(10), et.Node_1.ToString().PadLeft(10), et.Node_2.ToString().PadLeft(10), et.Node_3.ToString().PadLeft(10));
                }
            }
            sw.WriteLine("*ELEMENT,TYPE=S4,ELSET="+Form1.CompNameOnDentingSurface);
            foreach (Element et in _elementsAll)
            {
                if (!et.IsElementTriangle)
                {
                    sw.WriteLine("{0},{1},{2},{3},{4}", et.ElementID.ToString().PadLeft(10), et.Node_1.ToString().PadLeft(10), et.Node_2.ToString().PadLeft(10), et.Node_3.ToString().PadLeft(10), et.Node_4.ToString().PadLeft(10));
                }
            }

            foreach (Element et in _elementsAll)
            {
                if (et.ElementID>99900000)
                {
                    swd.WriteLine("  {0}, SPOS",et.ElementID.ToString().PadLeft(8));
                }
            }

            sw.Close();
            swd.Close();

        }

        public void WritePartCIncludeFile()
        {
            StreamWriter sw = new StreamWriter(Form1.IncludeFileDirectory + "\\PartC_N" + _dentingNodeID + ".inp");
            string tempInputFile = Form1.ImpactorFileFullPath + ".david";
            File.Copy(Form1.ImpactorFileFullPath, tempInputFile);
            StreamReader sr = new StreamReader(tempInputFile);

            bool canReadNode = false;
            string s = sr.ReadLine();
            while (s != null)
            {
                if (canReadNode)
                {

                    if (s.Length > 17 && s.Substring(0,18) == "**HMNAME SYSTEMCOL")
                    {
                        canReadNode = false;
                        break;
                    }
                    //关键代码添加位置
                    sw.WriteLine(s);

                }
                if (s.Length > 13 && s.Substring(0,14) == "**HWCOLOR COMP")
                {
                    canReadNode = true;
                }
                s = sr.ReadLine();
            }
            sr.Close();
            sw.Close();
            File.Delete(tempInputFile);
        }

        //构造函数
        public DentingNode()
        {
            ComponentID = 0;
            _dentingNodeID = 0;
            ImpactorRadio = 15;
            SplitCounts = 2;
            _elementsAll = new Elements();
            _elementsToPatch = new Elements();
            _elementsToRemain = new Elements();
            _elementsToSplit = new Elements();
            _nodesAll = new Nodes();
            _currentElement = new Element();
        }

        public DentingNode(string inputFilePath, int componentID, int dentingNodeID):this()
        {
            ComponentID = componentID;
            inputFileFullName = inputFilePath;
            _dentingNodeID = dentingNodeID;
            _elementsAll.CloneFromElements(Form1.ElementsOnDentingSurface);
            _nodesAll.CloneFromNodes(Form1.NodeOnDentingSurface);
            _currentElement = _elementsAll.FindElementsOnOneNode(dentingNodeID).Count > 0 ? _elementsAll.FindElementsOnOneNode(dentingNodeID)[0]: _currentElement;
        }

        public DentingNode(string inputFilePath,int dentingNodeID)
            : this(inputFilePath ,0 ,dentingNodeID)
        {

        }
    }
}
